// 从 vue 中导入 ref、nextTick 和 onMounted 方法
import { ref, nextTick, onMounted } from "vue";
// 从 pinia 中导入 defineStore 方法，用于定义状态管理仓库
import { defineStore } from "pinia";
// 从指定路径导入 askAliyun 和 abortAliyunRequest 方法，用于与阿里云进行交互和中止请求
import { askAliyun, abortAliyunRequest } from "@/api/wlxz/chat";
// 从指定路径导入用户状态管理仓库
import useUserStore from "@/store/modules/user";
// 从指定路径导入历史对话状态管理仓库
import { useHistoryStore } from "@/store/modules/chat/history";
// 从指定路径导入保存历史对话的方法
import { saveHistory } from "@/api/wlxz/history";

// 定义一个名为 chat 的状态管理仓库
export const useAnonymousStore = defineStore("anonymous", () => {
  // 定义输入框的值，使用 ref 创建响应式数据
  const inputValue = ref("");
  // 定义聊天消息列表，使用 ref 创建响应式数据
  const messages = ref([]);
  // 定义是否正在流式传输消息，使用 ref 创建响应式数据
  const isStreaming = ref(false);
  // 定义滚动条的位置，使用 ref 创建响应式数据
  const scrollTop = ref(0); // 滚动条位置
  // 定义当前 AI 回复的消息，使用 ref 创建响应式数据
  const currentAiMessage = ref(null);
  // 定义当前请求任务，使用 ref 创建响应式数据
  const currentRequestTask = ref(null);

  // 获取用户状态管理仓库的实例
  const userStore = useUserStore();
  // 获取历史对话状态管理仓库的实例
  const historyStore = useHistoryStore();

  // 处理发送消息的方法
  const handleSend = async () => {
    // 如果正在流式传输消息或者输入框为空，则直接返回
    if (isStreaming.value || !inputValue.value.trim()) return;

    // 如果用户未登录
    if (!userStore.token && userStore.id === "") {
      // 显示提示信息，告知用户需要先登录
      uni.showToast({
        title: "请先登录",
        icon: "none",
      });
      // 跳转到登录页面
      uni.$u.route({
        url: "/pages/login",
      });
      return;
    } else {
      console.log("用户已登录" + userStore.token);
    }
    // 如果正在流式传输消息
    if (isStreaming.value) {
      // 中止当前请求
      abortCurrentRequest();
      // 设置流式传输状态为 false
      isStreaming.value = false;
    }

    // 获取输入框的内容并去除首尾空格
    const userMessage = inputValue.value.trim();
    // 清空输入框
    inputValue.value = "";

    // 将用户消息添加到消息列表中
    messages.value.push({
      role: "user",
      content: userMessage,
    });

    // 初始化当前 AI 回复的消息
    currentAiMessage.value = {
      role: "assistant",
      content: "",
    };
    // 将当前 AI 回复的消息添加到消息列表中
    messages.value.push(currentAiMessage.value);

    // 滚动到消息列表底部
    scrollToBottom();

    try {
      // 设置流式传输状态为 true
      isStreaming.value = true;
      // 发起请求与阿里云交互，并处理流式响应
      currentRequestTask.value = askAliyun(
        userMessage,
        userStore.token,
        (text) => {
          // 将接收到的文本追加到当前 AI 回复的消息中
          currentAiMessage.value.content += text;
          // 在下一次 DOM 更新后滚动到消息列表底部
          nextTick(() => {
            scrollToBottom();
          });
        }
      )
        .catch((err) => {
          // 打印请求失败的错误信息
          console.error("请求失败:", err);
        })
        .finally(() => {
          if (historyStore.currentChatId == "") {
            historyStore.currentChatId = historyStore.createNewChat();
          }
          //将用户消息和AI回复消息保存到历史对话列表中
          const historyData = {
            userId: null,
            chatId: "privacy",
            ask: userMessage,
            request: currentAiMessage.value.content,
          };
          console.log("historyData", historyData);
          saveHistory(historyData);
          console.log("保存成功");

          // 设置流式传输状态为 false
          isStreaming.value = false;
          // 清空当前 AI 回复的消息
          currentAiMessage.value = null;
        });
    } catch (error) {
      // 清空当前 AI 回复的消息
      currentAiMessage.value = null;
    }
  };

  // 中止当前请求的方法
  const abortCurrentRequest = () => {
    // 调用中止阿里云请求的方法
    abortAliyunRequest();
    // 如果消息列表不为空且最后一条消息是 AI 回复的消息，则移除该消息
    if (
      messages.value.length > 0 &&
      messages.value[messages.value.length - 1].role === "assistant"
    ) {
      messages.value.pop();
    }
    // 清空当前 AI 回复的消息
    currentAiMessage.value = null;
  };

  // 滚动到消息列表底部的方法
  const scrollToBottom = () => {
    // 在下一次 DOM 更新后执行
    nextTick(() => {
      // 创建一个选择器查询对象
      const query = uni.createSelectorQuery();
      // 选择类名为 chat-content 的元素，并获取其边界矩形信息
      query
        .select(".chat-content")
        .boundingClientRect((data) => {
          // 如果获取到元素的边界矩形信息
          if (data) {
            // 设置滚动条的位置为元素高度的两倍
            scrollTop.value = data.height * 2;
          }
        })
        .exec();
    });
  };

  // 加载更多消息的方法，目前仅打印日志
  const loadMoreMessages = () => {
    console.log("加载更多消息");
  };
  // 清空聊天内容的方法
  const clearMessages = () => {
    // 清空消息列表
    messages.value = [];
    // 清空输入框
    inputValue.value = "";
    // 设置流式传输状态为 false
    isStreaming.value = false;
    // 清空当前 AI 回复的消息
    currentAiMessage.value = null;
    // 如果当前有请求任务，则中止该请求
    if (currentRequestTask.value) {
      abortCurrentRequest();
    }
  };

  // 返回状态管理仓库的状态和方法
  return {
    inputValue,
    messages,
    isStreaming,
    scrollTop,
    currentAiMessage,
    handleSend,
    abortCurrentRequest,
    scrollToBottom,
    loadMoreMessages,
    clearMessages,
  };
});
